Среди пользовательского интерфейса в Windows есть и набор функций под общим именем Windows Shell API. Вот одной из таких функций мы и воспользуемся для получения диалога выбора каталога. Вот как она будет выглядеть.

При создании проекта с данными возможностями нам требуется как минимум подключить LIB файл в Project Setting Link с именем Shell32.lib и заголовочный файл по месту назначения :-) с именем Shlobj.h. Итак, создавайте приложение на базе диалогового окна, ставьте в окно кнопку и привязывайте к ней событие нажатия, именно в нем мы и будем работать. Вот смотрите код.
BROWSEINFO bi;
TCHAR szDisplayName[MAX_PATH];
LPITEMIDLIST pidl;
LPMALLOC pMalloc = NULL;
ZeroMemory(&bi, sizeof(bi));
bi.hwndOwner = NULL;
bi.pszDisplayName = szDisplayName;
bi.lpszTitle = TEXT("Select folder");
bi.ulFlags = BIF_RETURNONLYFSDIRS;
pidl = SHBrowseForFolder(&bi);
if (pidl)
{
SHGetPathFromIDList(pidl, szDisplayName);
AfxMessageBox(szDisplayName);
}
Основу кода составляют две функции SHBrowseForFolder и SHGetPathFromIDList, одна из которых вызывает диалоговое окно, а вторая получает путь к каталогу.
WINSHELLAPI LPITEMIDLIST WINAPI SHBrowseForFolder
(
LPBROWSEINFO lpbi
);
WINSHELLAPI BOOL WINAPI SHGetPathFromIDList
(
LPCITEMIDLIST pidl,
LPSTR pszPath
);
Ну и естественно для ее использования нужно подготовить несколько структур. Основу составляет структура BROWSEINFO. Работает все так: после функции инициализации появляется указатель LPITEMIDLIST pidl, который используется для доступа ко всяким там функциям. А сам указатель появляется на основе заполнения структуры BROWSEINFO.
typedef struct _browseinfo {
HWND hwndOwner;
LPCITEMIDLIST pidlRoot;
LPSTR pszDisplayName;
LPCSTR lpszTitle;
UINT ulFlags;
BFFCALLBACK lpfn;
LPARAM lParam;
int iImage;
} BROWSEINFO, *PBROWSEINFO, *LPBROWSEINFO;
Эта структура описывает кучу параметров, таких как родительское окно, заголовок диалогового окна, всякие там флаги и так далее.
К радости или сожалению Shell API достойна отдельной темы разговора или отдельного раздела.